/*
 * ! Ext JS Library 4.0 Copyright(c) 2006-2011 Sencha Inc. licensing@sencha.com
 * http://www.sencha.com/license
 */

Ext.define('Ext.ux.desktop.App', {
	mixins : {
		observable : 'Ext.util.Observable'
	},

	// 动态加载时依赖的js
	requires : ['Ext.container.Viewport',

			'Ext.ux.desktop.Desktop'],
	isReady : false,
	modules : null,
	useQuickTips : true,
	// 系统首先调用此函数，然后逐步调用相关函数
	constructor : function(config) {
		var me = this;
		me.addEvents('ready', 'beforeunload');
		
		// 调用父类的构造函数,这个函数的第一个参数总是 this，以确保父类的构造函数在子类的作用域里工作。
        // 如果父类的构造函数需要传入参数，可以将所需的参数直接传递给它
		// 这样就得到了一个继承了父类的所有属性和函数的子类。
		
		me.mixins.observable.constructor.call(this, config);

		if (Ext.isReady) {
			Ext.Function.defer(me.init, 10, me);
		} else {
			// 当Ext框架全部加载完后
			Ext.onReady(me.init, me);
		}
		
		//me.init();
	},

	init : function() {
		var me = this, desktopCfg;
		if (me.useQuickTips) {
			Ext.QuickTips.init();
		}
		// 获取系统模块列表
		me.modules = me.getModules();
		
		if (me.modules) {
			me.initModules(me.modules);
		}

		// 主界面组件配置对象
		desktopCfg = me.getDesktopConfig();

		// 系统主界面组件
		me.desktop = new Ext.ux.desktop.Desktop(desktopCfg);

		// 程序主容器，系统主界面组件添加到Viewport容器里
		me.viewport = new Ext.container.Viewport({
			layout : 'fit',
			items : [me.desktop]
		});

		Ext.EventManager.on(window, 'beforeunload', me.onUnload, me);

		me.isReady = true;
		me.fireEvent('ready', me);
	},

	getModules : function(){alert("ggg")},

	/**
	 * 此方法用于返回主界面组件的配置对象 
	 * A derived class can override this method, call the base
	 * version to build the config and then modify the returned object before
	 * returning it.
	 */
	getDesktopConfig : function() {
		var me = this, cfg = {
			app : me,
			taskbarConfig : me.getTaskbarConfig()
		};
		// 将对象复制
		Ext.apply(cfg, me.desktopConfig);
		return cfg;
	},
	
	/**
	 * This method returns the configuration object for the TaskBar. A derived
	 * class can override this method, call the base version to build the config
	 * and then modify the returned object before returning it.
	 */
	getTaskbarConfig : function() {
		var me = this, cfg = {
			app : me,
			startConfig : me.getStartConfig()
		};
		Ext.apply(cfg, me.taskbarConfig);
		return cfg;
	},
	
	/**
	 * 此方法返回Start菜单的配置对象
	 * This method returns the configuration object for the Start Button. A
	 * derived class can override this method, call the base version to build
	 * the config and then modify the returned object before returning it.
	 */
	getStartConfig : function() {
		var me = this, cfg = {
			app : me,
			menu : []
		};
		Ext.apply(cfg, me.startConfig);

		Ext.each(me.modules, function(module) {
					// 添加内容到Start菜单
					if (module.launcher) {
						// push() 方法可向数组的末尾添加一个或多个元素，并返回新的长度
						cfg.menu.push(module.launcher);
					}
				});

		return cfg;
	},
	
	initModules : function(modules) {
		var me = this;
		//迭代一个数组，数组中每个成员都将调用一次所传函数，直到函数返回false才停止执行。
		// module 为数组成员
		Ext.each(modules, function(module) {
					module.app = me;
				});
	},

	getModule : function(name) {
		var ms = this.modules;
		for (var i = 0, len = ms.length; i < len; i++) {
			var m = ms[i];
			if (m.id == name || m.appType == name) {
				return m;
			}
		}
		return null;
	},

	onReady : function(fn, scope) {
		if (this.isReady) {
			fn.call(scope, this);
		} else {
			this.on({
				ready : fn,
				scope : scope,
				single : true
			});
		}
	},

	getDesktop : function() {
		return this.desktop;
	},

	onUnload : function(e) {
		if (this.fireEvent('beforeunload', this) === false) {
			e.stopEvent();
		}
	}
});
